from __future__ import annotations

from enum import Enum
from typing import Iterable, List


class LoadCombinationType(str, Enum):
    ULTIMATE = "ultimate"  # 承载力极限状态
    SERVICEABILITY = "serviceability"  # 正常使用极限状态


def compute_design_value(standard_value: float, gamma: float) -> float:
    """根据分项系数计算设计值。

    参数:
    - standard_value: 标准值
    - gamma: 分项系数 γ

    返回:
    - 设计值 = 标准值 × γ
    """

    return standard_value * gamma


def combine_actions(
    effects: Iterable[float],
    combination_factors: Iterable[float],
    partial_factors: Iterable[float],
    combination: LoadCombinationType = LoadCombinationType.ULTIMATE,
) -> float:
    """荷载效应组合作用值（线性组合）。

    计算式参考 GB 50009/GB 50068 通用规则：S = Σ(ψ_i × γ_i × S_i)。

    参数:
    - effects: 各荷载效应标准值 S_i（如弯矩/剪力/轴力）
    - combination_factors: 组合系数 ψ_i
    - partial_factors: 分项系数 γ_i
    - combination: 组合工况类型，仅用于标注

    返回:
    - 组合后的设计效应值
    """

    total = 0.0
    for s, psi, gamma in zip(effects, combination_factors, partial_factors):
        total += s * psi * gamma
    return total


def wind_pressure_design(q_basic: float, altitude_coeff: float, shape_coeff: float, importance_coeff: float) -> float:
    """风压设计值计算。

    常用表达：q_z = q_0 × μ_z × μ_s × μ_i。
    - q_0: 基本风压 (kN/m²)
    - μ_z: 高度变化系数
    - μ_s: 体型系数
    - μ_i: 重要性系数
    返回:
    - q_z 设计风压 (kN/m²)
    """

    return q_basic * altitude_coeff * shape_coeff * importance_coeff


